iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0

當收到使用者請求時,程式會依呼叫的api進行不同操作,
如果沒特別設計的話,通常會以線性的方式處理,但是中間處理流程如果拖長,
使用者收到回應的速度也會變慢,如果慢到一定程度,
會造成使用者使用感不佳,這時go的並行處理就能派上用場了,
將中間處理的流程並行處理,就可以提高使用者的體驗。

goroutine

在go裡面要使用他的並行功能,就需要了解goroutine。
當webserver主程式啟動時,其實是在一個main goroutine內執行,
而當我們要建立新的goroutine時,可以用go指令來建立。

func getUserData(sqlDriver *sql.DB, userID int64)(userData user, err error){
    ......
}
func updateUserData(sqlDriver *sql.DB, userID int64, newUserData user)(err error){
    .....
}

上面那個函式內容假定為取出使用者資料以及更新使用者資料,
如果一個api請求內部,需要多次取出資料並更新資料,
照原本線性流程,會先處理第一筆,再來第二筆,直到最後一筆處理完,才回應給使用者,
類似下面範例。

for _, userID := range {
    userData, err := getUserData(slaveDriver, userID)
    if err !=nil {
    }
    //after update userData
    updateUserData(master, userID)
    
}

以上面範例,會等for迴圈一筆一筆跑完,才回應使用者,造成流程時間拖長,
這時可以使用go指令來將中間流程放入goroutine內處理

    for _, userID := range {
    go func(){
        userData, err := getUserData(slaveDriver, userID)
        if err !=nil {
        }
        //after update userData
        updateUserData(master, userID)
    }()
    
}

這樣就可以將中間處理各自放入goroutine內處理,提高處理速度,
使用者也不會卡在那邊等了,不過這樣方式我們無法控制各個goroutine內的處理,
因此下一章會介紹channel,來達成goroutine之間的溝通。


上一篇
Day18-Redis
下一篇
Day20-平行處理 channel
系列文
從0開始的golang web server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言